home *** CD-ROM | disk | FTP | other *** search
/ Mac Magazin/MacEasy 2 / Mac Magazin and MacEasy Magazine CD - Issue 02.iso / Sharewarebibliothek / Applikationen / Alpha.5.81 folder / Tcl / SystemCode / c.tcl < prev    next >
Text File  |  1994-06-15  |  5KB  |  210 lines

  1. #=============================================================================
  2. # "Electric" C functions.
  3. #=============================================================================
  4.  
  5. # returns the indent string of the line named by 'pos'
  6. proc indentString pos {
  7.     set start [lineStart $pos]
  8.     set end [nextLineStart $pos]
  9.     set text [getText $start $end]
  10.     for {set i 0} {1} {incr i} {
  11.         set c [string index $text $i]
  12.         if {($c != "\ ") && ($c != "\t")} then {
  13.             return [string range $text 0 [expr $i-1]]
  14.         }
  15.     }
  16.     return
  17. }
  18.  
  19.  
  20. # Brace on new line, same indentation. Insert on another new line, indented in.
  21. # First, see if we are on new line.
  22. proc electricCLeft {} {
  23.     global elecLBrace
  24.     deleteText [getPos] [selEnd]
  25.     if {$elecLBrace == "0"} then {
  26.         insertText "\{"
  27.         return
  28.     }
  29.     set pos [getPos]
  30.     set start [lineStart $pos]
  31.     set text [getText $start $pos]
  32.     
  33.     for {set i $start} {$i < $pos} {incr i} {
  34.         set c [lookAt $i]
  35.         if {($c != "\ ") && ($c != "\t")} then {
  36.             set indentation [getText $start $i]
  37.             insertText " \{\r" $indentation "\t"
  38.             return
  39.         }
  40.     }
  41.     set indentation [getText $start $pos]
  42.     insertText "\{\r" $indentation "\t"
  43. }
  44. bind '\{' <s> electricCLeft
  45.  
  46.  
  47. # Brace on new line, immediate carriage return
  48. proc electricCRight {} {
  49.     global elecRBrace
  50.     deleteText [getPos] [selEnd]
  51.     if {$elecRBrace == "0"} then {
  52.         insertText "\}"
  53.         catch {blink [matchIt "\}" [expr [getPos]-2]]}
  54.         return
  55.     }
  56.     set pos [getPos]
  57.     set start [lineStart $pos]
  58.     
  59.     if {[catch {matchIt "\}" [expr $pos-1]} matched]} {
  60.         beep
  61.         return
  62.     }
  63.     set text [getText [lineStart $matched] $matched]
  64.     regexp {^[     ]*} $text indentation
  65.     for {set i $start} {$i < $pos} {incr i} {
  66.         set c [lookAt $i]
  67.         if {($c != "\ ") && ($c != "\t")} then {
  68.             insertText "\r" $indentation "\}\r" $indentation
  69.             blink $matched
  70.             return
  71.         }
  72.     }
  73.     set text [set indentation]\}\r$indentation
  74.     replaceText $start $pos $text
  75.     goto [expr {$start + [string length $text]}]
  76.     blink [matchIt "\}" [expr $start-2]]
  77. }
  78. bind '\}' <s> electricCRight
  79.  
  80.  
  81. # Brace on new line, immediate carriage return. We don't do our electric stuff
  82. # if we are in the middle of a for statement.
  83. proc electricCSemi {} {
  84.     global electricSemi
  85.     deleteText [getPos] [selEnd]
  86.     if {$electricSemi == "0"} then {
  87.         insertText ";"
  88.         return
  89.     }
  90.     set pos [getPos]
  91.     set start [lineStart $pos]
  92.     set text [getText $start $pos]
  93.     
  94.     if {[string first "for" $text] != "-1"} {
  95.         set lefts 0
  96.         set rights 0
  97.         set len [string length $text]
  98.         for {set i 0} {$i < $len} {incr i} {
  99.             case [string index $text $i] in {
  100.                 "("    { incr lefts }
  101.                 ")"    { incr rights }
  102.             }
  103.         }
  104.         global globs
  105.         set globs [list $lefts $rights $len]
  106.         if {$lefts != $rights} {
  107.             insertText ";"
  108.             return
  109.         }
  110.     }
  111.     
  112.     insertText ";\r" [indentString $pos]
  113. }
  114. bind '\;' electricCSemi
  115.  
  116.  
  117. # 'C' programming mode 
  118.  
  119. proc setCMode {} {
  120.     global thinkMenu
  121.     changeMode "C"
  122.     uplevel #0 {
  123.         set prefixString "//"
  124.         set elecLBrace 1
  125.         set elecRBrace 1
  126.         set electricSemi 1
  127.         set wordWrap 0
  128.         set funcExpr {^[^ \t\(#\r/@].*\(.*\)$}
  129.         set sortedIsDefault 1
  130. #        set wordBreakPreface {[^a-zA-Z0-9]}
  131. #        set wordBreak {[a-zA-Z0-9]+}
  132.         set wordBreakPreface {[^a-zA-Z0-9_]}
  133.         set wordBreak {[a-zA-Z0-9_]+}
  134.     }
  135.     insertMenu    $thinkMenu
  136. }
  137.  
  138. proc cMarkFile {} {
  139.     global markSorting
  140.     set markSorting 2
  141.     set pos 0
  142.     while {![catch {search -f 1 -r 1 -m 0 -i 0 {^([^ \t\(#\r/@].*[ \t]+)?([A-Za-z0-9:~_]+)[ \t\r]*\(.*\)[ \t]*$} $pos} res]} {
  143.         set start [lindex $res 0]
  144.         set end [expr [lindex $res 1] + 1]
  145.         if {[regexp {([a-zA-Z:_]+)[ \t]*\(} [getText $start $end] dummy word]} {
  146.             set inds($word) [lineStart [expr $start - 1]]
  147.         }
  148.         set pos $end
  149.     }
  150.     if {[info exists inds]} {
  151.         foreach f [lsort [array names inds]] {
  152.             set next [nextLineStart $inds($f)]
  153.             setNamedMark $f $inds($f) $next $next
  154.         }
  155.     }
  156. }
  157.     
  158. proc c++MarkFile {} {
  159.     global mpos
  160.     
  161.     set end [maxPos]
  162.     set pos 0
  163.     set l {}
  164.     while {![catch {search -f 1 -r 1 -m 0 -i 0 {^([^ \t\(#\r/@].*[ \t]+)?([A-Za-z0-9:~_]+)[ \t\r]*\(.*\)?$} $pos} res]} {
  165.         set start [lindex $res 0]
  166.         set end [nextLineStart $start]
  167.         set word [lindex [getText $start $end] 0]
  168.         lappend l $word
  169.         set mpos($word) $start
  170.         set pos $end
  171.     }
  172.     return [lsort $l]
  173. }
  174.     
  175. proc setC++Mode {} {
  176.     global wordBreakPreface wordBreak thinkMenu
  177.     changeMode "C++"
  178.      uplevel #0 {
  179.         set prefixString "//"
  180.         set elecLBrace 1
  181.         set elecRBrace 1
  182.         set electricSemi 1
  183.         set wordWrap 0
  184.           set funcExpr {^([^ \t\(#\r/@].*[ \t]+)?([A-Za-z0-9:~_]+)[ \t\r]*\(.*\)?$}
  185.         set funcPar 2
  186.         set sortedIsDefault 1
  187.         set wordBreakPreface {[^a-zA-Z0-9_]}
  188.         set wordBreak {[a-zA-Z0-9_]+}
  189.     }
  190.     insertMenu    $thinkMenu
  191. }
  192.  
  193.  
  194.  
  195. source "$HOME:Tcl:SystemCode:think.tcl"
  196.  
  197.  
  198. #================================================================================
  199. # "C" code
  200. #================================================================================
  201. set cCommentRegexp    {/\*(([^*]/)|[^*]|\r)*\*/}
  202. set cPreRegexp        {^\#[\t ]*[a-z]*}
  203. set cKeyWords        {void register short enum extern int for if while struct static long switch case char unsigned double float return else}
  204.  
  205. regModeKeywords -e {//} -b {/*} {*/} -c red -k blue C $cKeyWords
  206. regModeKeywords -e {//} -b {/*} {*/} -c red -k blue {C++} [concat {new delete} $cKeyWords]
  207.  
  208.  
  209.  
  210.